package com.qf.controller;

import com.qf.pojo.SmsInterfaceForm;
import com.qf.service.SmsInterfaceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/sms")
public class SmsInterfaceController {

    //从git仓库的配置文件中获取这个属性
    //获取被nginx代理后request中的ip地址
    @Value("${ip-header}")
    private List<String> ipHeaders;

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private SmsInterfaceService smsInterfaceService;

    @PostMapping("/smsInterface")
    public Map<String, String> smsInterface(SmsInterfaceForm smsForm){

        //1.获取客户服务器的ip地址
        String ip = getIpAddr();
        smsForm.setIp(ip);

        //2.校验短信对象中的属性不能为空
        Map<String, String> resultMap = checkNull(smsForm);

        if (resultMap != null && resultMap.size() > 0){
            return resultMap;
        }
        //3.调用service进行深度校验短信对象的每一个属性
        resultMap = smsInterfaceService.checkSmsForm(smsForm);

        //4.如果没有问题，返回给客户响应编码
        return resultMap;
    }

    //检验短信对象是否为空，并返回响应编码
    private Map<String, String> checkNull(SmsInterfaceForm smsForm){

        Map<String, String> resultMap = new HashMap<>();

        if(StringUtils.isEmpty(smsForm.getClientID())){

            resultMap.put("code", "101");
            resultMap.put("msg", "认证错：clientId错误");

        }

        if(StringUtils.isEmpty(smsForm.getContent())){

            resultMap.put("code", "104");
            resultMap.put("msg", "消息长度错，为空或超长（目前定为500个字）");

        }

        if(StringUtils.isEmpty(smsForm.getIp())){

            resultMap.put("code", "103");
            resultMap.put("msg", "IP校验错误");

        }

        if(StringUtils.isEmpty(smsForm.getMobile())){

            resultMap.put("code", "105");
            resultMap.put("msg", "手机号错误");

        }

        if(StringUtils.isEmpty(smsForm.getPwd())){

            resultMap.put("code", "102");
            resultMap.put("msg", "密码错误");

        }

        if(StringUtils.isEmpty(smsForm.getSrcID())){

            resultMap.put("code", "106");
            resultMap.put("msg", "下行编号（srcID）错误");

        }
        return resultMap;

    }

    //获取客户服务器的ip地址
    //客户请求可能被nginx代理，也可能没有被代理
    private String getIpAddr(){

        //获取被代理后的请求中的ip地址
        if (ipHeaders != null){
            //遍历被代理的请求头属性名称集合
            for (String ipHeader : ipHeaders) {
                //从请求头中根据属性名，获取属性值，也就是ip地址
                String ip = request.getHeader(ipHeader);
                //判断是否能够获取到ip地址
                if(!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)){
                    return ip;
                }
            }
        }

        //获取没有被代理的请求中的ip地址
        String ip = request.getRemoteAddr();
        return ip;

    }
}
